<!DOCTYPE html>
<html lang="fr">
	<head>
		<meta charset="utf-8" />
		<base href="../../../" />
		<script src="page.js"></script>
		<link type="text/css" rel="stylesheet" href="page.css" />
	</head>
	<body>
		<h1>Système d'animation ([name])</h1>

		<h2>Aperçu</h2>

		<p class="desc">
			Dans le système d'animation de three.js vous pouvez animer différentes propriétés de vos modèles:
			les os d'un [page:SkinnedMesh skinned and rigged model], les morph targets, les différentes propriétés des matériaux
			(couleurs, opacité, booléens), la visibilité et les transformations. Les propriétés animées peuvent avoir différentes animations comme un fade-in,
			un fade-out, un fondu ou un warp. Le poids et l'échelle temporelle des différentes animations simultanées
			sur le même objet peuvent également être changées indépendamment.
			Différentes animations sur le même objet peuvent-être
			synchronisées.<br /><br />

			Pour effectuer tout cela dans un système homogène, le système d'animation three.js 
			[link:https://github.com/mrdoob/three.js/issues/6881 a complètement changé en 2015]
			(attention aux informations dépassées!), et a maintenant une architecture similaire à
			Unity/Unreal Engine 4. Cette page offre un bref aperçu des principaux composants du système
			et de comment ils fonctionnent ensemble.

		</p>

		<h3>Animation Clips</h3>

		<p class="desc">

			Si vous aveez réussi à importer un modèle 3D (peu importe qu'il ait
			des os ou une morph targets ou les deux) — par exemple en l'exportant depuis Blender avec le
			[link:https://github.com/KhronosGroup/glTF-Blender-IO glTF Blender exporter] et
			en le chargeant dans la scène three.js en utilisant [page:GLTFLoader] — un des champs doit-être
			un tableau nommé "animations", contenant les [page:AnimationClip AnimationClips]
			pour ce modèle (voir une liste des loaders possibles ci-dessous).<br /><br />

			Chaque `AnimationClip` conserve les données d'une certaine activité d'un objet. Si le
			mesh est un personnage, par exemple, il pourrait y avoir un AnimationClip pour une marche, un second
			pour un saut, un troisième pour un pas de côté et ainsi de suite.

		</p>

		<h3>Keyframe Tracks</h3>

		<p class="desc">

			A l'intérieur d'un `AnimationClip` les données pour chaque propriétés animées sont stockées
			dans un [page:KeyframeTrack] séparé. En considérant que l'objet personnage a un [page:Skeleton skeleton],
			un keyframe track pourrait stocker les changements de valeur de la position de l'os inférieur d'un bras
			à travers le temps, un track différent stockerait les changements de valeur de la rotation du même bras, un troisème
			pourrait stocker la position, la rotation ou l'échelle d'un autre os, ainsi de suite. Il doit-être clair qu'un,
			AnimationClip peut-être composé de beaucoup de ce genre de tracks.<br /><br />

			En considérant que le modèle a un morph targets (par exemple un morph
			target pour un visage amical et un autre pour un visage énervé), chaque track conserve
			l'information de comment l'[page:Mesh.morphTargetInfluences influence] d'un certain morph
			change durant l'exécution du clip.

		</p>

		<h3>Mixer d'Animations</h3>

		<p class="desc">

			Les informations stockées représentent uniquement la base de l'animation - le playback est en réalité contrôlé par
			l'[page:AnimationMixer]. Vous vous doutez bien que ce n'est pas uniquement un visualiseur d'animations, mais
			une simulation d'un hardware comme une vraie console de mixage , qui peut contrôler plusieurs animations
			simultanément, les mélangeant et les fusionnant.

		</p>

		<h3>Actions d'Animations</h3>

		<p class="desc">

			L'`AnimationMixer` en lui-même a seulement quelques propriétés (générales) et méthodes, car il
			peut-être contrôlé par l'[page:AnimationAction AnimationActions]. En configurant un
			`AnimationAction` vous pouvez déterminer qu'un certain `AnimationClip` doit-être joué, mis en pause
			ou stoppé sur un des mixers, si et à quelle fréquence le clip doit-être répeté, si il
			doit-être joué avec un fade, une mise à l'échelle temporelle, et d'autres choses, comme le fondu
			ou la synchronisation.

		</p>

		<h3>Animations de Groupes d'Objets</h3>

		<p class="desc">

			Si vous voulez qu'un groupe d'objets reçoive un statut d'animation partagé, vous pouvez utiliser un
			[page:AnimationObjectGroup].

		</p>

		<h3>Formats et loaders supportés</h3>

		<p class="desc">
			Notez que tous les formats de modèles n'incluent pas les animations (notamment OBJ ne les supporte pas), et que seulement certains
			loaders three.js supportent les séquences d'[page:AnimationClip AnimationClip]. Plusieurs autres <i>supportent</i>
			ce type d'animations:
		</p>

			<ul>
				<li>[page:ObjectLoader THREE.ObjectLoader]</li>
				<li>THREE.BVHLoader</li>
				<li>THREE.ColladaLoader</li>
				<li>THREE.FBXLoader</li>
				<li>[page:GLTFLoader THREE.GLTFLoader]</li>
				<li>THREE.MMDLoader</li>
			</ul>

		<p class="desc">
			Notez que 3ds max et Maya ne peuvent actuellement pas exporter plusieurs animations (qui ne sont pas sur
			la même timeline) directement dans un seul fichier.
		</p>

		<h2>Exemple</h2>

		<code>
		let mesh;

		// Create an AnimationMixer, and get the list of AnimationClip instances
		const mixer = new THREE.AnimationMixer( mesh );
		const clips = mesh.animations;

		// Update the mixer on each frame
		function update () {
			mixer.update( deltaSeconds );
		}

		// Play a specific animation
		const clip = THREE.AnimationClip.findByName( clips, 'dance' );
		const action = mixer.clipAction( clip );
		action.play();

		// Play all animations
		clips.forEach( function ( clip ) {
			mixer.clipAction( clip ).play();
		} );
		</code>

	</body>
</html>
